package Commun;

import java.sql.ResultSet;

import DAO.EnseignementDAO;
import DAO.InscriptionDAO;
import DAO.MasterDAO;
import Factory.DAOFactory;
import Factory.PostgresDAOFactory;
import POJO.*;
import java.sql.SQLException;

public class Controler {
    private PostgresDAOFactory postgresDAO;
    private InscriptionDAO insDAO;
    private MasterDAO masterDAO;
    private EnseignementDAO ensDAO;
    private static Controler instance = new Controler();
        
    private Controler(){
        postgresDAO = (PostgresDAOFactory) DAOFactory.getDAOFActory(DAOFactory.POSTGREDAOFACTORY);
        insDAO = (InscriptionDAO) postgresDAO.getInscriptionDAO();
        masterDAO = (MasterDAO) postgresDAO.getMasterDAO();
        ensDAO = (EnseignementDAO) postgresDAO.getEnseignementDAO();
    }

    public static Controler getInstance(){
        return instance;
    }

    public void closeConnexion(){
        try{
            Connexion.getConnexion().close();
        }catch(java.sql.SQLException e){
        	System.out.println("Probleme a la fermeture de la connexion!");
        }
    }
    
    public Master findMaster(long id){
        ResultSet res = null;
        ResultSet list_ens = null;
        Master m = null;
        try {
            res = masterDAO.find(id);
            m = new Master();
            while(res.next()){
                m.setNom(res.getString("Nom_master"));
                m.setId(res.getLong("Master_ID"));
            }
            list_ens = ensDAO.findEnseignementByMaster(id);
            Enseignement e;
            while (list_ens.next()){
                e = new Enseignement();
                e.setId(list_ens.getLong("Enseignement_ID"));
                e.setDescription(list_ens.getString("Description"));
                e.setIntitule(list_ens.getString("Intitule"));
                e.setMaster(m);
                m.addEnseignement(e);
            }
           Connexion.getConnexion().commit();
        } catch (SQLException e) {
            try {
                Connexion.getConnexion().rollback();
            } catch (SQLException se) {}
            e.printStackTrace();
        }finally{
            try{
                if(res!=null){
                    res.getStatement().close();
                    res.close();
                }
                if(list_ens!=null){
                    list_ens.getStatement().close();
                    list_ens.close();
                }
            }catch(java.sql.SQLException e){
                e.printStackTrace();
            }
        }
	return m;
    }
    
    public Enseignement findEnseignement(long id){
        Enseignement e = null;
        ResultSet res = null;
    	try{
            res = ensDAO.find(id);
            e = new Enseignement();
            Master m = new Master();
            while(res.next()){
                m.setId(res.getLong("Master_ID"));
                m.setNom(res.getString("Nom_Master"));
                e.setIntitule(res.getString("Intitule"));
                e.setId(res.getLong("Enseignement_ID"));
                e.setDescription(res.getString("Description"));
            }
            m.addEnseignement(e);
            e.setMaster(m);
            Connexion.getConnexion().commit();
    	} catch (java.sql.SQLException ex) {
            try {
                Connexion.getConnexion().rollback();
            } catch (SQLException se) {}
            ex.printStackTrace();
    	}finally{
            try{
                if(res!=null){
                    res.getStatement().close();
                    res.close();
                }
            }catch(java.sql.SQLException ex){
                ex.printStackTrace();
            }
        }
    	return e;
    }
    
    public boolean updateEnseignement(Enseignement e){
        boolean res = false;
        try{
            Enseignement old_ens = findEnseignement(e.getId());
            Master old_master = old_ens.getMaster();
            Master new_master = e.getMaster();
            if (!(old_master.getId() == new_master.getId())){
                    if (!old_master.removeEnseignement(old_ens)){
                            System.out.println("Probleme remove enseignement");
                            return false;
                    }
                    if (!new_master.addEnseignement(e)){
                            System.out.println("Probleme add enseignement");
                            return false;
                    }
            }
            res = ensDAO.update(e);
            Connexion.getConnexion().commit();
        }catch(Exception se){
            try {
                Connexion.getConnexion().rollback();
            } catch (SQLException ex) {}
        }
    	return res;
    }
    
    public boolean updateMaster(Master m){
    	return masterDAO.update(m);
    }
    
    public Inscription createInscription(Inscription i){
    	Inscription ins;
    	try{
    		ins = insDAO.create(i);
    		Connexion.getConnexion().commit();
    		return ins;
		} catch (java.sql.SQLException ex) {
	        try {
	            Connexion.getConnexion().rollback();
	        } catch (SQLException se) {}
	        ex.printStackTrace();
		}
		return null;
    }
    
    public Inscription findInscription(long id){
        Inscription i = null;
        ResultSet res = null;
    	try{
            res = insDAO.find(id);
            Master m = null;
            Enseignement e = null;
            i = new Inscription();
            while(res.next()){
                i.setId(res.getLong("Inscription_ID"));
                m = instance.findMaster(res.getLong("Master_id"));
                e = instance.findEnseignement(res.getLong("Enseignement_id"));
            }
            i.setMaster(m);
            i.setEnseignement(e);
            Connexion.getConnexion().commit();
    	} catch (java.sql.SQLException ex) {
            try {
                Connexion.getConnexion().rollback();
            } catch (SQLException se) {}
            ex.printStackTrace();
    	}finally{
            try{
                if(res!=null){
                    res.getStatement().close();
                    res.close();
                }
            }catch(java.sql.SQLException ex){
                ex.printStackTrace();
            }
        }
    	return i;
    }
    
    public boolean deleteInscription(Inscription i){
    	boolean res = false;
    	try{
    		res = insDAO.delete(i);
    		Connexion.getConnexion().commit();
		} catch (java.sql.SQLException ex) {
	        try {
	            Connexion.getConnexion().rollback();
	        } catch (SQLException se) {}
	        ex.printStackTrace();
		}
		return res;
    }
}